home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
-
- #include "parse.h"
- #include <math.h>
- #include <stream.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include "generic.h"
- #include "gizmo.h"
-
- // vertonlineline(): makes the vertex v at the intersection of
- // lines l1 and l2.
-
- void vertonlineline(vertex *v, line *l1, line *l2)
- {
- v->xw = l1->YW*l2->W - l1->W*l2->YW;
- v->yw = l1->W*l2->XW - l1->XW*l2->W;
- v->w = l1->XW*l2->YW - l1->YW*l2->XW;
- if (v->w != 0.0) {
- v->xw /= v->w; v->yw /= v->w; v->w = 1.0;
- }
- }
-
- float vvdist(vertex *v1, vertex *v2)
- {
- if (v1->w == 0.0 || v2->w == 0) return 1.0e30;
- float x1 = v1->xw;
- float x2 = v2->xw;
- float y1 = v1->yw;
- float y2 = v2->yw;
- return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
- }
-
- float vldist(vertex *v, line *l) // perp distance: v to l
- {
- if (v->w == 0 || (l->XW == 0.0 && l->YW == 0.0)) return 1.0e30;
- return fabs((l->XW*v->xw+l->YW*v->yw+l->W)/sqrt(l->XW*l->XW+l->YW*l->YW));
- }
-
- void solvevlc(line *l, circle *c, vertex *v, long rootnumber)
- {
- float disc, vx, vy, wx, wy, alpha;
- long ok = 0;
-
- if (l->v1.w != 0.0) {
- vx = l->v1.xw;
- vy = l->v1.yw;
- ok = 1;
- } else {
- vx = l->v1.xw + l->v2.xw;
- vy = l->v1.yw + l->v2.yw;
- }
- if (l->v2.w != 0.0) {
- wx = l->v2.xw;
- wy = l->v2.yw;
- ok = 1;
- } else {
- wx = l->v1.xw + l->v2.xw;
- wy = l->v1.yw + l->v2.yw;
- }
- float cx = c->center.xw;
- float cy = c->center.yw;
- float R = c->radius;
- float A = (vx-wx)*(vx-wx)+(vy-wy)*(vy-wy);
- float B = 2*((vx-wx)*(wx-cx)+(vy-wy)*(wy-cy));
- float C = (wx-cx)*(wx-cx)+(wy-cy)*(wy-cy) - R*R;
- if ((disc = B*B-4.0*A*C) < 0.0 || (ok == 0)) {
- v->xw = v->yw = v->w = 0.0;
- return;
- }
- if (rootnumber == 1) alpha = ((-B + sqrt(disc))/(2.0*A));
- else alpha = ((-B - sqrt(disc))/(2.0*A));
- v->xw = alpha*(vx)+(1-alpha)*(wx);
- v->yw = alpha*(vy)+(1-alpha)*(wy);
- v->w = 1.0;
- }
-
- // homogenizeline(): assumes that the two vertices are correct;
- // figures out the line's homogeneous coordinates from those.
-
- void homogenizeline(line *l)
- {
- if ((l->v1.xw == 0.0 && l->v1.yw == 0.0 && l->v1.w == 0.0) ||
- (l->v2.xw == 0.0 && l->v2.yw == 0.0 && l->v2.w == 0.0)) {
- l->XW = l->YW = l->W = 0.0;
- return;
- }
- l->XW = l->v1.yw*l->v2.w - l->v1.w*l->v2.yw;
- l->YW = l->v2.xw*l->v1.w - l->v1.xw*l->v2.w;
- l->W = l->v1.xw*l->v2.yw - l->v2.xw*l->v1.yw;
- }
-
- void line_vertcircletan(line *l)
- {
- l->v1.w = l->v2.w = 1.0;
- vertex *v = (vertex *)l->c.p1;
- circle *c = (circle *)l->c.p2;
- if ((c->c.type == CIRCVERTVERT && c->c.p2 == v) ||
- (v->c.type == VERTONCIRCLE && v->c.p1 == c) ||
- (v->c.type == VERTLINECIRC1 && v->c.p2 == c) ||
- (v->c.type == VERTLINECIRC2 && v->c.p2 == c) ||
- (v->c.type == VERTCIRCCIRC1 && (v->c.p1 == c || v->c.p2 == c)) ||
- (v->c.type == VERTCIRCCIRC2 && (v->c.p1 == c || v->c.p2 == c)) ||
- (c->c.type == CIRCVERTVERTVERT && ((c->c.p1 == v) ||
- (c->c.p2 == v) || (c->c.p3 == v)))) {
- // Vertex is defined to be on the circle.
- l->v1.xw = v->xw;
- l->v1.yw = v->yw;
- if (v->yw == c->center.yw) {
- l->v2.xw = v->xw;
- l->v2.yw = 0.0;
- } else {
- l->v2.xw = v->xw + 1.0;
- l->v2.yw = v->yw - (v->xw - c->center.xw)/(v->yw - c->center.yw);
- }
- homogenizeline(l);
- return;
- }
- // XXX assumes finite center
- float qx = v->xw - c->center.xw;
- float qy = v->yw - c->center.yw;
- float R = sqrt(qx*qx+qy*qy);
- float r = c->radius;
- float xx = r*r/R;
- float d = 1.0-xx/R;
- if (d < 0.0) {
- l->v1.xw = l->v2.xw = 0.0;
- l->v1.yw = 0.0; l->v2.yw = 0.0;
- l->v1.w = l->v2.w = 0.0;
- homogenizeline(l);
- return;
- }
- float yy = r*sqrt(d);
- if (l->c.type == LINEVERTCIRC2) yy = -yy;
- float xx1 = xx*qx/R - yy*qy/R;
- float yy1 = xx*qy/R + yy*qx/R;
- l->v1.xw = v->xw; l->v1.yw = v->yw; l->v1.w = v->w;
- l->v2.xw = xx1 + c->center.xw;
- l->v2.yw = yy1 + c->center.yw;
- homogenizeline(l);
- }
-
- void line_circcircleint(line *l)
- {
- // XXX assumes circle's centers are finite
- l->v1.w = l->v2.w = 1.0;
- circle *c1 = (circle *)l->c.p1;
- circle *c2 = (circle *)l->c.p2;
- float c1x = c1->center.xw, c1y = c1->center.yw;
- float c2x = c2->center.xw, c2y = c2->center.yw;
- float r1 = c1->radius, r2 = c2->radius;
- if (r1 == r2) return;
- float vx = c2x - (c2x-c1x)*(r2/(r1+r2));
- float vy = c2y - (c2y-c1y)*(r2/(r1+r2));
- float qx = vx - c1->center.xw;
- float qy = vy - c1->center.yw;
- float R = sqrt(qx*qx+qy*qy);
- float r = c1->radius;
- float xx = r*r/R;
- float d = 1.0-xx/R;
- float qx2 = vx - c2->center.xw;
- float qy2 = vy - c2->center.yw;
- float R2 = sqrt(qx2*qx2+qy2*qy2);
- float rr2 = c2->radius;
- float xx2 = rr2*rr2/R2;
- float d2 = 1.0-xx2/R2;
- if (d < 0.0) {
- l->v1.xw = l->v2.xw = 0.0;
- l->v1.yw = 0.0; l->v2.yw = 0.0;
- l->v1.w = l->v2.w = 0.0;
- homogenizeline(l);
- return;
- }
- float yy = r*sqrt(d);
- if (l->c.type == LINECIRCCIRCINT2) yy = -yy;
- float yy2 = rr2*sqrt(d2);
- if (l->c.type == LINECIRCCIRCINT2) yy2 = -yy2;
- float xx1 = xx*qx/R - yy*qy/R;
- float yy1 = xx*qy/R + yy*qx/R;
- float xxx2 = xx2*qx2/R2 - yy2*qy2/R2;
- float yyy2 = xx2*qy2/R2 + yy2*qx2/R2;
- //l->v1.xw = vx; l->v1.yw = vy;
- l->v2.xw = xx1 + c1->center.xw;
- l->v2.yw = yy1 + c1->center.yw;
- l->v1.xw = xxx2 + c2->center.xw;
- l->v1.yw = yyy2 + c2->center.yw;
- homogenizeline(l);
- }
-
- void line_circcircleext(line *l)
- {
- // assumes finite circle centers
- l->v1.w = l->v2.w = 1.0;
- circle *c1 = (circle *)l->c.p1;
- circle *c2 = (circle *)l->c.p2;
- float c1x = c1->center.xw, c1y = c1->center.yw;
- float c2x = c2->center.xw, c2y = c2->center.yw;
- float r1 = c1->radius, r2 = c2->radius;
- if (r1 == r2) return;
- float vx = c2x + (c2x-c1x)*(r2/(r1-r2));
- float vy = c2y + (c2y-c1y)*(r2/(r1-r2));
- float qx = vx - c1->center.xw;
- float qy = vy - c1->center.yw;
- float R = sqrt(qx*qx+qy*qy);
- float r = c1->radius;
- float xx = r*r/R;
- float d = 1.0-xx/R;
- float qx2 = vx - c2->center.xw;
- float qy2 = vy - c2->center.yw;
- float R2 = sqrt(qx2*qx2+qy2*qy2);
- float rr2 = c2->radius;
- float xx2 = rr2*rr2/R2;
- float d2 = 1.0-xx2/R2;
- if (d < 0.0) {
- l->v1.xw = l->v2.xw = 0.0;
- l->v1.yw = 0.0; l->v2.yw = 0.0;
- l->v1.w = l->v2.w = 0.0;
- homogenizeline(l);
- return;
- }
- float yy = r*sqrt(d);
- if (l->c.type == LINECIRCCIRCEXT2) yy = -yy;
- float yy2 = rr2*sqrt(d2);
- if (l->c.type == LINECIRCCIRCEXT2) yy2 = -yy2;
- float xx1 = xx*qx/R - yy*qy/R;
- float yy1 = xx*qy/R + yy*qx/R;
- float xxx2 = xx2*qx2/R2 - yy2*qy2/R2;
- float yyy2 = xx2*qy2/R2 + yy2*qx2/R2;
- //l->v1.xw = vx; l->v1.yw = vy;
- l->v2.xw = xx1 + c1->center.xw;
- l->v2.yw = yy1 + c1->center.yw;
- l->v1.xw = xxx2 + c2->center.xw;
- l->v1.yw = yyy2 + c2->center.yw;
- homogenizeline(l);
- }
-
- void vert_circcircle(vertex *v)
- {
- circle *c1 = (circle *)v->c.p1;
- circle *c2 = (circle *)v->c.p2;
- float c1x = c1->center.xw, c1y = c1->center.yw;
- float c2x = c2->center.xw, c2y = c2->center.yw;
- float r1 = c1->radius, r2 = c2->radius;
- float Q = sqrt((c1x-c2x)*(c1x-c2x)+(c1y-c2y)*(c1y-c2y));
- float Rcost = -(r2*r2 - r1*r1 - Q*Q)/(2*Q);
- float d = r1*r1 - Rcost*Rcost;
- v->w = 1.0;
- if (d < 0.0) {
- v->xw = v->yw = v->w = 0.0;
- return;
- }
- float Rsint = sqrt(d);
- float vx = c1x + Rcost*(c2x-c1x)/Q;
- float vy = c1y + Rcost*(c2y-c1y)/Q;
- if (v->c.type == VERTCIRCCIRC1) {
- v->xw = vx + Rsint*(c2y-c1y)/Q;
- v->yw = vy + Rsint*(c1x-c2x)/Q;
- } else {
- v->xw = vx - Rsint*(c2y-c1y)/Q;
- v->yw = vy - Rsint*(c1x-c2x)/Q;
- }
- }
-
- void vert_lineconic(vertex *v)
- {
- line *l = (line *)v->c.p1;
- conic *c = (conic *)v->c.p2;
- float A = l->XW, B = l->YW, C = l->W;
- if (A != 0.0) {
- float AA = c->aa*B*B/(A*A) - c->bb*B/A + c->cc;
- float BB = 2.0*c->aa*B*C/(A*A) - c->bb*C/A - c->dd*B/A + c->ee;
- float CC = c->aa*C*C/(A*A) - c->dd*C/A + c->ff;
- float D = BB*BB - 4.0*AA*CC;
- if (D < 0) {
- v->xw = 0.0; v->yw = 0.0; v->w = 0.0;
- return;
- }
- if (v->c.type == VERTLINECONIC1) {
- v->yw = (-BB + sqrt(D))/(2.0*AA);
- v->xw = -B*v->yw/A - C/A;
- v->w = 1.0;
- } else {
- v->yw = (-BB - sqrt(D))/(2.0*AA);
- v->xw = -B*v->yw/A - C/A;
- v->w = 1.0;
- }
- } else {
- float AA = c->aa;
- float BB = c->dd - C*c->bb/B;
- float CC = c->cc*C*C/(B*B) - c->ee*C/B + c->ff;
- float D = BB*BB - 4.0*AA*CC;
- if (D < 0) {
- v->xw = 0.0; v->yw = 0.0; v->w = 0.0;
- return;
- }
- if (v->c.type == VERTLINECONIC1) {
- v->yw = -C/B;
- v->xw = (-BB + sqrt(D))/(2.0*AA);
- v->w = 1.0;
- } else {
- v->yw = -C/B;
- v->xw = (-BB - sqrt(D))/(2.0*AA);
- v->w = 1.0;
- }
- }
- }
-
- void circle_lll(circle *c)
- {
- vertex v1, v2, v3;
- vertex w1, w2;
- long circindex;
- line ll1, ll2;
-
- line *l1 = (line *)c->c.p1;
- line *l2 = (line *)c->c.p2;
- line *l3 = (line *)c->c.p3;
- vertonlineline(&v3, l1, l2);
- vertonlineline(&v2, l1, l3);
- vertonlineline(&v1, l2, l3);
- switch (c->c.type) {
- case CIRCLINELINELINE1: circindex = 0; break;
- case CIRCLINELINELINE2: circindex = 1; break;
- case CIRCLINELINELINE3: circindex = 2; break;
- case CIRCLINELINELINE4: circindex = 3; break;
- }
- float R12 = vvdist(&v1, &v2);
- float R13 = vvdist(&v1, &v3);
- float R23 = vvdist(&v2, &v3);
- if (R12 == 0.0 || R13 == 0.0 || R23 == 0.0) {
- c->center.xw = c->center.yw = 1.0e30;
- c->radius = 1.0;
- return;
- }
- float alpha1 = 1 + ((circindex&1) ? R12/R13 : - R12/R13);
- float alpha2 = 1 + ((circindex&2) ? R12/R23 : - R12/R23);
- w1.xw = (alpha1*v1.xw + (1-alpha1)*v3.xw + v2.xw)/2.0;
- w1.yw = (alpha1*v1.yw + (1-alpha1)*v3.yw + v2.yw)/2.0;
- w1.w = 1.0;
- // v1-w1 is one of two angle bisectors
- w2.xw = (alpha2*v2.xw + (1-alpha2)*v3.xw + v1.xw)/2.0;
- w2.yw = (alpha2*v2.yw + (1-alpha2)*v3.yw + v1.yw)/2.0;
- w2.w = 1.0;
- ll1.v1 = v1; ll1.v2 = w1;
- ll2.v1 = v2; ll2.v2 = w2;
- homogenizeline(&ll1); homogenizeline(&ll2);
- vertonlineline(&c->center, &ll1, &ll2);
- c->radius = vldist(&c->center, l1);
- }
-
- void circle_vvv(circle *c)
- {
- c->center.w = 1.0;
- vertex *v1 = (vertex *)c->c.p1;
- vertex *v2 = (vertex *)c->c.p2;
- vertex *v3 = (vertex *)c->c.p3;
- float bx = v1->xw; float by = v1->yw;
- float cx = v2->xw; float cy = v2->yw;
- float dx = v3->xw; float dy = v3->yw;
- float temp = cx*cx+cy*cy;
- float bc = (bx*bx + by*by - temp)/2.0;
- float cd = (temp - dx*dx - dy*dy)/2.0;
- float det = (bx-cx)*(cy-dy)-(cx-dx)*(by-cy);
- if (fabs(det) < 1.0e-6) {
- c->center.xw = c->center.yw = 1.0;
- c->center.w = 0.0;
- c->v1 = *v1;
- c->v2 = *v2;
- c->v3 = *v3;
- return;
- }
- det = 1/det;
- c->center.xw = (bc*(cy-dy)-cd*(by-cy))*det;
- c->center.yw = ((bx-cx)*cd-(cx-dx)*bc)*det;
- cx = c->center.xw; cy = c->center.yw;
- c->radius = sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
- }
-
- void circle_ccinvert(circle *c)
- {
- c->center.w = 1.0;
- circle *inv = (circle *)c->c.p2;
- circle *crc = (circle *)c->c.p1;
- vertex ctr = inv->center;
- float r = inv->radius;
- float px, py, qx, qy, rx, ry;
- px = qx = crc->center.xw;
- rx = px + crc->radius;
- ry = crc->center.yw;
- py = crc->center.yw + crc->radius;
- qy = crc->center.yw - crc->radius;
- float bx, by, cx, cy, dx, dy;
- float f;
- f = r*r/((px-ctr.xw)*(px-ctr.xw)+(py-ctr.yw)*(py-ctr.yw));
- bx = ctr.xw + (px - ctr.xw) * f;
- by = ctr.yw + (py - ctr.yw) * f;
- f = r*r/((qx-ctr.xw)*(qx-ctr.xw)+(qy-ctr.yw)*(qy-ctr.yw));
- cx = ctr.xw + (qx - ctr.xw) * f;
- cy = ctr.yw + (qy - ctr.yw) * f;
- f = r*r/((rx-ctr.xw)*(rx-ctr.xw)+(ry-ctr.yw)*(ry-ctr.yw));
- dx = ctr.xw + (rx - ctr.xw) * f;
- dy = ctr.yw + (ry - ctr.yw) * f;
- float bc = (bx*bx + by*by - cx*cx - cy*cy)/2.0;
- float cd = (cx*cx + cy*cy - dx*dx - dy*dy)/2.0;
- float det = (bx-cx)*(cy-dy)-(cx-dx)*(by-cy);
- if (det == 0) {
- c->center.xw = c->center.yw = 1.0e30;
- c->radius = 1.0;
- return;
- }
- c->center.xw = (bc*(cy-dy)-cd*(by-cy))/det;
- c->center.yw = ((bx-cx)*cd-(cx-dx)*bc)/det;
- cx = c->center.xw; cy = c->center.yw;
- c->radius = sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
- }
-
-
- void v_vcinvert(vertex *v)
- {
- circle *inv = (circle *)v->c.p2;
- vertex *orig = (vertex *)v->c.p1;
- vertex ctr = inv->center;
- float r = inv->radius;
- float px, py;
- px = orig->xw;
- py = orig->yw;
- float f;
- f = r*r/((px-ctr.xw)*(px-ctr.xw)+(py-ctr.yw)*(py-ctr.yw));
- v->xw = ctr.xw + (px - ctr.xw) * f;
- v->yw = ctr.yw + (py - ctr.yw) * f;
- v->w = 1.0;
- }
-
- void circle_linecinvert(circle *c)
- {
- c->center.w = 1.0;
- circle *inv = (circle *)c->c.p2;
- line *l = (line *)c->c.p1;
- vertex ctr = inv->center;
- float r = inv->radius;
- float px, py, qx, qy, rx, ry;
- px = l->v1.xw; py = l->v1.yw;
- qx = l->v2.xw; qy = l->v2.yw;
- rx = px + 2*(qx-px);
- ry = py + 2*(qy-py);
- float bx, by, cx, cy, dx, dy;
- float f;
- f = r*r/((px-ctr.xw)*(px-ctr.xw)+(py-ctr.yw)*(py-ctr.yw));
- bx = ctr.xw + (px - ctr.xw) * f;
- by = ctr.yw + (py - ctr.yw) * f;
- f = r*r/((qx-ctr.xw)*(qx-ctr.xw)+(qy-ctr.yw)*(qy-ctr.yw));
- cx = ctr.xw + (qx - ctr.xw) * f;
- cy = ctr.yw + (qy - ctr.yw) * f;
- f = r*r/((rx-ctr.xw)*(rx-ctr.xw)+(ry-ctr.yw)*(ry-ctr.yw));
- dx = ctr.xw + (rx - ctr.xw) * f;
- dy = ctr.yw + (ry - ctr.yw) * f;
- float bc = (bx*bx + by*by - cx*cx - cy*cy)/2.0;
- float cd = (cx*cx + cy*cy - dx*dx - dy*dy)/2.0;
- float det = (bx-cx)*(cy-dy)-(cx-dx)*(by-cy);
- if (det == 0) {
- c->center.xw = c->center.yw = 1.0e30;
- c->radius = 1.0;
- return;
- }
- c->center.xw = (bc*(cy-dy)-cd*(by-cy))/det;
- c->center.yw = ((bx-cx)*cd-(cx-dx)*bc)/det;
- cx = c->center.xw; cy = c->center.yw;
- c->radius = sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
- }
-
- void ratio_vvv(length *r)
- {
- vertex *v1 = (vertex *)r->c.p1;
- vertex *v2 = (vertex *)r->c.p2;
- vertex *v3 = (vertex *)r->c.p3;
- float dist1 = vvdist(v1, v2);
- float dist2 = vvdist(v1, v3);
- float dot = (v3->xw-v1->xw)*(v2->xw-v1->xw)
- + (v3->yw-v1->yw)*(v2->yw-v1->yw);
- if (dist2 == 0) r->value = 1.0e30;
- else r->value = dist1/dist2;
- if (dot < 0.0) r->value *= -1.0;
- }
-
- void vlvmirror(vertex *v)
- {
- line *l = (line *)v->c.p1;
- vertex *vv = (vertex *)v->c.p2;
- vertex *v1 = &l->v1;
- vertex *v2 = &l->v2;
- float x0 = v1->xw;
- float y0 = v1->yw;
- float x1 = v2->xw;
- float y1 = v2->yw;
- float px = vv->xw, py = vv->yw;
- float xw, yw;
- float alpha = ((x1-px)*(x1-x0) + (y1-py)*(y1-y0))/
- ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
- xw = alpha*x0 + (1-alpha)*x1;
- yw = alpha*y0 + (1-alpha)*y1;
- v->xw = 2*xw - px;
- v->yw = 2*yw - py;
- v->w = 1.0;
- }
-
- void v_vvratio(vertex *v)
- {
- vertex *v1 = (vertex *)v->c.p1;
- vertex *v2 = (vertex *)v->c.p2;
- float rat = ((length *)(v->c.p3))->value;
- v->xw = (1-rat)*v1->xw + rat*v2->xw;
- v->yw = (1-rat)*v1->yw + rat*v2->yw;
- v->w = 1.0;
- }
-
- void a_vvv(length *a)
- {
- vertex *v1 = (vertex *)a->c.p1;
- vertex *v2 = (vertex *)a->c.p2;
- vertex *v3 = (vertex *)a->c.p3;
- float x2 = v3->xw - v2->xw;
- float y2 = v3->yw - v2->yw;
- float x1 = v1->xw - v2->xw;
- float y1 = v1->yw - v2->yw;
- a->value = atan2(y2, x2) - atan2(y1, x1);
- if (a->value < 0.0) a->value += 2.0*PI;
- }
-
- void v_avv(vertex *v)
- {
- length *a = (length *)v->c.p1;
- vertex *v1 = (vertex *)v->c.p2;
- vertex *v2 = (vertex *)v->c.p3;
- float x1 = v1->xw - v2->xw;
- float y1 = v1->yw - v2->yw;
- float c = cos(a->value), s = sin(a->value);
- v->xw = v2->xw + x1*c - y1*s;
- v->yw = v2->yw + x1*s + y1*c;
- v->w = 1.0;
- }
-